嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,一樣有請今天的one piece:
( model 關聯性就像海軍的階級啊!)
部落格接下來要進展到文章的階段了,在此之前,先來講一下 model 關聯性吧。
什麼是關聯性, Rails 將 model 用分層級的方式來連接 model (可以用上司下屬的感覺去聯想),也就是透過宣告的方式,讓 a model 屬於 b model ,而這樣的方法可以讓在建立資料的時候簡單很多,因為 Rails 會幫你做出好用的方法,以官方文件的例子來說:
若不設立關聯性,在建立一筆屬於顧客的訂單時,必須在建立的時候在指定一個顧客id給他:
@order = Order.create(order_date: Time.now, customer_id: @customer.id)
若要刪除顧客及他所有的訂單又更麻煩了,要先將訂單都撈出來,一筆一筆刪掉後,再刪顧客:
@orders = Order.where(customer_id: @customer.id)
@orders.each do |order|
order.destroy
end
@customer.destroy
而使用關聯性的情況:
class Customer < ActiveRecord::Base
has_many :orders, dependent: :destroy
end
class Order < ActiveRecord::Base
belongs_to :customer
end
建立訂單:
@order = @customer.orders.create(order_date: Time.now)
刪除顧客及他所有的訂單:
@customer.destroy
see~~~,整個程式碼都變得清爽起來了~
而 model 之間彼此的關聯性主要有三種:
我主要會著重在一對多跟多對多。
用部落格的方式去想,一個 admin 會有很多的 post
class Admin < ActiveRecord::Base
has_many :posts #盡量是複數喔!
end
這樣的話,rails 對於 admin,會生出一些方法可以用:
admin1 = Admin.first
post1 = Posts.first
#===========#
admin1.posts # 可以列出admin1的所有文章,是一個陣列
admin1.posts = posts1 #把 post1 這篇文章指定給 admin1
#請注意,這樣是把 admin1 的所有文章砍掉只剩 post1 喔,若是要新增,請使用
admin1.posts << posts1
admin1.posts.build(title:'一對多關聯性')
#用admin1的角度,建立一篇標題為'一對多關聯性的'文章
#要再呼叫save方法才會存入資料庫
admin1.posts.create(title:'一對多關聯性')
#同上,不過不需呼叫save方法
而這些 posts 會屬於 admin。
class Post < ActiveRecord::Base
belongs_to :admin #盡量是單數喔!
end
一樣,對於 post,會生出一些方法可以用於反查:
admin2 = Admin.second
post2 = Posts.second
#===========#
post2.admin # 列出 post2 的作者
post2.admin = admin2 #把post2的作者,指定為admin2
接著讓我們進行部落格實作的部分!
昨天發現一個bug,我current_admin的方法寫錯了,囧"
請聽我娓娓道來:
admin 登入後會有一個發一個session[:admin_token]
給他,但我沒有讓它存在任何一個欄位裡,根本就找不到這個 admin 啊!
所以我對admin的資料表多開一個欄位放 token,並將 sign_in 跟 current_admin 的部份改寫了一下:
# admin_controller
private
def sign_in_admin(admin)
session[:admin_token] = SecureRandom.uuid
admin.update(token: session[:admin_token])
end
# application_controller
def current_admin
@current_admin ||= Admin.find_by(token: session[:admin_token])
end
其實也可以使用環境變數寫死,不過這樣在之後上線的時候會需要設定比較多東西~所以我選擇開一個欄位~
接著我們進行到文章的部分,有些重複的動作我一樣寫概略,這部分會著重在model那邊。
一樣先來想一下我們的資料裡們會需要有哪些欄位?
其中 admin_id 就是為了最上面所說的一對多關聯性,而建立model的時候,可以用rails g model Post title content admin_id:references
用:references
的話,會自動去model幫你加上belongs_to :admin
,降低寫錯的機率!
好的,明天我們再來繼續多對多關聯性以及文章分類的部分,感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見!